package com.atguigu.interview.juc;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * @Author : Jungle
 * @Description :
 */
public class AQSDemo {
    public static void main(String[] args) {
        Map<Object, Object> map = new HashMap<>();
        ReentrantLock lock = new ReentrantLock();
        CountDownLatch countDownLatch = new CountDownLatch(10);
        ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock();
        //  带入一个银行办理业务的案例来模拟我们的AQs如何进行线程的管理和通知唤醒机制
        //  3个线程模拟3个来银行网点，受理窗口办理业务的顾客
        //A顾客就是第一个顾客，此时受理窗口没有任何人，A可以直接去办理

        new Thread(() -> {
            lock.lock();
            try {
                System.out.println("=========A thread come in");
                try {
                    TimeUnit.MINUTES.sleep(20);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            } finally {
                lock.unlock();
            }
        }, "A").start();


        //第2个顾客，第2个线程---->，由于受理业务的窗口只有一个(只能一个线程持有锁)，此时B只能等待，
        // 进入候客区

        new Thread(() -> {
            lock.lock();
            try {
                System.out.println("=========B thread come in");
                try {
                    TimeUnit.MINUTES.sleep(20);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            } finally {
                lock.unlock();
            }
        }, "B").start();


        //第3个顾客，第3个线程---->，由于受理业务的窗口只有一个(只能一个线程持有锁)，此时B只能等待，
        // 进入候客区

        new Thread(() -> {
            lock.lock();
            try {
                System.out.println("=========C thread come in");
                try {
                    TimeUnit.MINUTES.sleep(20);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            } finally {
                lock.unlock();
            }
        }, "C").start();
    }


}
